#ifndef MANAGER_H_
#define MANAGER_H_

#include "Defines.h"
#include <mpi.h>

class Manager
{

public:

    /*-----------------------------------------------------------------------------
     *  Inicializa o MPI e o gerenciador
     *-----------------------------------------------------------------------------*/
    static void init();

    /*-----------------------------------------------------------------------------
     *  Finaliza o MPI
     *-----------------------------------------------------------------------------*/
    static void finalize();

    /*-----------------------------------------------------------------------------
     *  Distribui as linhas entre os processos
     *-----------------------------------------------------------------------------*/
    static void distribute(uint nrows);

    /*-----------------------------------------------------------------------------
     *  Retorna a quantidade de linhas no passo step
     *-----------------------------------------------------------------------------*/
    static uint getNRows(uint step = 0);

    /*-----------------------------------------------------------------------------
     *  Retorna a linha inicial no passo step
     *-----------------------------------------------------------------------------*/
    static uint getInitRow(uint step = 0);

    /*-----------------------------------------------------------------------------
     *  Retorna o próximo rank
     *-----------------------------------------------------------------------------*/
    static uint nextRank(uint step = 1);

    /*-----------------------------------------------------------------------------
     *  Retorna o rank anterior
     *-----------------------------------------------------------------------------*/
    static uint prevRank(uint step = 1);

    /*-----------------------------------------------------------------------------
     *  Retorna o rank atual
     *-----------------------------------------------------------------------------*/
    static uint getRank() { return rank; }

    /*-----------------------------------------------------------------------------
     *  Retorna número de processos
     *-----------------------------------------------------------------------------*/
    static uint getNProcs() { return nProcs; }

private:

    /*-----------------------------------------------------------------------------
     *  Imprime o nome do nó atual
     *-----------------------------------------------------------------------------*/
    static void printName();

    /*-----------------------------------------------------------------------------
     *  Quantidade de linhas para cada processo
     *-----------------------------------------------------------------------------*/
    static uintArray nRows;

    /*-----------------------------------------------------------------------------
     *  Linhas iniciais para cada processo
     *-----------------------------------------------------------------------------*/
    static uintArray initRow;

    /*-----------------------------------------------------------------------------
     *  Quantidade de processos
     *-----------------------------------------------------------------------------*/
    static uint nProcs;

    /*-----------------------------------------------------------------------------
     *  Rank do processo atual
     *-----------------------------------------------------------------------------*/
    static uint rank;


};

#endif
